////类中有指针成员，默认拷贝构造会有浅拷贝缺陷,浅拷贝只拷贝地址
//#include <iostream>
//#include <cstring>
//
//using namespace std;
//
////模拟C++标准的string类实现自己的string类
//class String {
//public:
//    String(const char *psz = "") : m_psz(new char[strlen(psz) + 1]) {
//        strcpy(m_psz, psz);
//    }
//
//    ~String() {
//        delete[] this->m_psz;
//        //释放m_psz本身所占内存空间
//    }
//
//    char *c_str() {
//        return m_psz;
//    }
//
//    String(/*String* this*/const String &that) : m_psz(new char[strlen(that.m_psz)] + 1) {
//        //【char* m_psz = new char[strlen(that.m_psz)+1];】
//        strcpy(m_psz, that.m_psz);//不复制地址，复制地址指向的数据 -->深拷贝
//    }
//
//    //默认的拷贝复赋值函数
////    String& operator = (const String& that){
////        this->m_psz = that.m_psz;//只复制了地址，没有复制地址指向的数据 -->浅拷贝
////        return * this;
////    }
//    String &operator=(/*String* this*/const String &that) {
//        if (this != &that) {//防止自赋值
//            delete[] this->m_psz;//释放旧资源
//            this->m_psz = new char[strlen(that.m_psz) + 1];//申请新资源
//            strcpy(m_psz, that.m_psz);//拷贝新数据
//        }
//        return *this;//返回自引用
//    }
//
//private:
//    char *m_psz;
//};
//
//int main(void) {
//    String s1("Hello");
//    cout << "S1:" << s1.c_str() << "s1中的m_psz指向的堆内存的地址" << (void *) s1.c_str() << endl;
//
//    String s2(s1);//=s1;定义s2,利用s2.String(s1)-->拷贝构造函数
//    cout << "s2:" << s2.c_str() << "s2中的m_psz指向的堆内存的地址：" << (void *) s2.c_str() << endl;
//    String s3;//定义s3,利用s3.String() -->维护一个自己的内存('\0')
//    s3 = s2;
//    cout << "s3:" << s3.c_str() << "中的m_psz指向的堆内存地址" << (void *) s3.c_str() << endl;
//    return 0;
//}